import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
const TimeOut = 3600// 定义token超时事件
import { getTimeStamp } from '@/utils/auth'
import router from '@/router'

// 创建一个 axios 实例 | create an axios instance
const service = axios.create({
  // 当yarn dev时,获取.env.development,访问/api,实现跨域代理
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 5000 // 请求超时 | request timeout (超过五秒钟将会请求超时)
})

// 请求拦截器 | request interceptor
service.interceptors.request.use((config) => {
// config是请求的配置信息
// 注入token
  const token = store.getters.token
  if (token) {
    // 如果有token
    if (checkTimeOut()) {
      // 如果为true,则过期了
      console.log('token过期')
      store.dispatch('user/logout')
      // 跳转到登录页
      router.push('/login')
    }
    config.headers['Authorization'] = `Bearer ${token}`
  }
  return config// 必须要返回的
}, (error) => {
  return Promise.reject(error)
})

// 响应拦截器 | response interceptor
service.interceptors.response.use((response) => {
// axios默认将响应的数据加了一层data
  const { success, message, data } = response.data
  if (success) {
    // 响应为成功数据，返回data
    return data
  } else {
    // 响应数据为失败
    // 提示错误信息
    Message.error(message)
    // 进入catch(Promise.reject方法)，并返回错误对象(没有错误对象就new一个Error)
    return Promise.reject(new Error(message))
  }
},
async(error) => {
  if (error.response && error.response.data && error.response.data.code === 10002) {
    // 10002：后端提示该token超时
    await store.dispatch('user/logout')
    router.push(`/login`)
  }
  Message.error(error.Message)// 提示错误信息
  return Promise.reject(error)// 返回执行错误，让当前的执行链跳出成功，直接进入 catch
})

// 超时逻辑： 当前时间-缓存时间 是否大于时间差
function checkTimeOut() {
  const currentTime = Date.now()// 当前时间
  const timeStamp = getTimeStamp()// 单位毫秒
  return (currentTime - timeStamp) / 1000 > TimeOut
}
// 导出
export default service
